#!/bin/bash

# Spring Boot应用启动脚本 - 专为ali环境配置
# 使用方法: ./run.sh {start|stop|restart|logs}
# 注意: 直接运行 ./run.sh 将默认查看日志

APP_NAME="server-wms"
JAR_FILE="$APP_NAME.jar"
PROFILE="ali"
LOG_DIR="./logs"
PID_FILE="app.pid"
JAVA_OPTS="-Xms256m -Xmx256m -XX:MaxMetaspaceSize=128m -XX:+UseG1GC -Dspring.profiles.active=$PROFILE"

# 创建日志目录
mkdir -p $LOG_DIR

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 打印彩色信息
print_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

print_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查应用是否在运行
is_running() {
    if [ -f "$PID_FILE" ]; then
        local pid=$(cat "$PID_FILE")
        if ps -p $pid > /dev/null 2>&1 && [[ $(ps -p $pid -o comm=) =~ "java" ]]; then
            return 0
        else
            rm -f "$PID_FILE"
            return 1
        fi
    else
        return 1
    fi
}

# 获取最新的日志文件
get_latest_logfile() {
    if [ -d "$LOG_DIR" ]; then
        # 按修改时间排序，获取最新的日志文件
        find "$LOG_DIR" -name "*.log" -type f -printf '%T@ %p\n' 2>/dev/null | sort -n | tail -1 | cut -f2- -d" "
    else
        echo ""
    fi
}

# 等待应用启动
wait_for_start() {
    local pid=$1
    local count=0
    local max_wait=60  # 最大等待60秒

    print_info "等待应用启动..."

    while [ $count -lt $max_wait ]; do
        if ! ps -p $pid > /dev/null 2>&1; then
            print_error "应用进程已退出，启动失败"
            return 1
        fi

        # 检查是否有日志文件生成，说明应用已经开始运行
        local log_file=$(get_latest_logfile)
        if [ -n "$log_file" ] && [ -s "$log_file" ]; then
            print_info "应用启动完成"
            return 0
        fi

        sleep 2
        count=$((count + 2))
    done

    print_warn "应用启动较慢，请稍后使用 './run.sh logs' 查看启动状态"
    return 0
}

# 查看应用日志
logs() {
    local log_file=$(get_latest_logfile)

    if [ -z "$log_file" ]; then
        print_error "未找到日志文件"
        print_info "日志目录: $LOG_DIR"

        # 如果应用正在运行但没找到日志，提示可能的位置
        if is_running; then
            print_info "应用正在运行，但未找到日志文件，请检查日志配置"
        fi
        return 1
    fi

    if [ ! -f "$log_file" ]; then
        print_error "日志文件不存在: $log_file"
        return 1
    fi

    print_info "正在显示日志: $log_file"
    echo "=========================================="
    tail -f "$log_file"
}

# 启动应用
start() {
    if is_running; then
        print_warn "应用已经在运行中 (PID: $(cat $PID_FILE))"

        # 即使应用已在运行，也询问是否查看日志
        read -p "应用已在运行，是否查看日志? [y/N]: " -n 1 -r
        echo
        if [[ $REPLY =~ ^[Yy]$ ]]; then
            logs
        fi
        return 0
    fi

    # 检查JAR文件是否存在
    if [ ! -f "$JAR_FILE" ]; then
        print_error "JAR文件不存在: $JAR_FILE"
        return 1
    fi

    print_info "正在启动 $APP_NAME，使用 profile: $PROFILE..."

    # 打印启动命令
    print_info "启动命令: nohup java $JAVA_OPTS -jar $JAR_FILE > /dev/null 2>&1 &"

    # 启动应用，输出重定向到/dev/null（垃圾桶）
    nohup java $JAVA_OPTS -jar $JAR_FILE > /dev/null 2>&1 &
    local pid=$!
    echo $pid > $PID_FILE

    print_info "应用启动中... PID: $pid"

    # 等待应用启动
    if wait_for_start $pid; then
        print_info "启动成功，自动跳转到日志界面..."
        # 短暂延迟，确保日志文件有内容
        sleep 3
        logs
    else
        # 启动失败，显示可能的错误信息
        print_error "启动失败，请检查以下可能的原因："
        print_error "1. 内存不足，尝试减少JVM内存设置"
        print_error "2. 端口被占用"
        print_error "3. 应用配置错误"

        # 尝试从系统日志获取更多信息
        print_info "=== 系统日志片段 ==="
        dmesg | tail -10

        rm -f "$PID_FILE"
        return 1
    fi
}

# 停止应用
stop() {
    if ! is_running; then
        print_warn "应用未在运行"
        return 0
    fi

    local pid=$(cat "$PID_FILE")
    print_info "正在停止应用 (PID: $pid)..."

    # 先尝试优雅停止
    kill $pid
    local count=0
    while [ $count -lt 30 ]; do
        if is_running; then
            sleep 1
            count=$((count + 1))
        else
            break
        fi
    done

    # 如果优雅停止失败，强制停止
    if is_running; then
        print_warn "优雅停止失败，强制杀死应用..."
        kill -9 $pid
        sleep 2
    fi

    # 确认进程已停止
    if ps -p $pid > /dev/null 2>&1; then
        print_error "无法停止应用，请手动检查"
        return 1
    else
        rm -f "$PID_FILE"
        print_info "应用已停止"
        return 0
    fi
}

# 重启应用
restart() {
    print_info "重启应用..."
    if stop; then
        sleep 2
        start
    else
        print_error "停止应用失败，无法重启"
        return 1
    fi
}

# 显示帮助信息
show_help() {
    echo "使用方法: $0 {start|stop|restart|logs}"
    echo ""
    echo "命令说明:"
    echo "  start    - 启动应用 (profile: $PROFILE)，成功后自动查看日志"
    echo "  stop     - 停止应用"
    echo "  restart  - 重启应用，成功后自动查看日志"
    echo "  logs     - 实时查看应用日志"
    echo ""
    echo "注意: 直接运行 '$0' 将默认查看应用日志"
}

# 主逻辑
if [ $# -eq 0 ]; then
    # 如果没有提供参数，默认执行 logs
    logs
else
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        restart)
            restart
            ;;
        logs)
            logs
            ;;
        help|--help|-h)
            show_help
            ;;
        *)
            print_error "未知命令: $1"
            echo ""
            show_help
            exit 1
            ;;
    esac
fi
